package DsPattern.Singleton;

public class LazyS {
	private LazyS() {}

	/**
	 * 1.单例模式【线程不安全,不推荐】
	 * 因为没有加锁synchronized，严格意义上不算单例。
	 * @return
	 */
	private static LazyS instance1;

	public static LazyS getInstance() {
		if (instance1 == null) {//这里是不安全的，可能得到两个不同的实例
			instance1 = new LazyS();
		}
		return instance1;
	}


	/**
	 * 2.线程安全但效率低【不推荐】
	 * 99%的情况下不需要同步
	 * @return
	 */
	private static LazyS instance2;

	public static synchronized LazyS getInstance1() {
		if (instance2 == null) {
			instance2 = new LazyS();
		}
		return instance2;
	}

	/**
	 * 3.单例模式，线程不安全【不推荐】
	 * 虽然加了锁，但是等到第一个线程执行完instance3=new LazyS();跳出锁时
	 * 另一个线程恰好刚判断完instance3为null，此时又会加载另一个实例
	 */
	private static LazyS instance3;

	public static LazyS getInstance2() {
		if (instance3 == null) {
			synchronized (LazyS.class) {
				instance3 = new LazyS();
			}
		}
		return instance3;
	}

	/**
	 * 4.双重校验锁：延迟加载+线程安全【推荐】
	 */
	private static volatile LazyS instance4;

	public static LazyS getInstance4() {
		if (instance4 == null) {
			synchronized (LazyS.class) {
				if (instance4 == null) {
					instance4 = new LazyS();
				}
			}
		}
		return instance4;
	}
}
